
function welcome( message ) {
    console.log( `欢迎${this.nickname}。接收到: ${message}` );
}

// 直接通过函数名来调用函数
welcome( '你猜猜我是谁?' );

let panda = { nickname: '熊猫儿' }

welcome.call( panda , '我猜你猜不到我是谁' );

console.log( '- - - - - - - - - - - - - - - - - - - -' );

// 定义函数
function Student( name ){
    this.name = name ;
}

// 在原型上扩展属性
Student.prototype.show = function(){
    console.log( this.name );
}

let s = new Student( '姜老板' );
s.show(); // 此时 show 函数内部的 this 表示 s 所指向的实例

console.log( '- - - - - - - - - - - - - - - - - - - - ' );

let x = { name: '小姜同学' }

// 通过 s.show 找到 Student 原型上的 show 函数
// 在通过 call 来调用 show 函数
// 并在 call 函数第一个参数 绑定 未来执行的 show 函数内部的 this
s.show.call( x );

// 总结:
// 1、除箭头函数外，其它函数都可以通过 call 方式来调用并设置函数内部的 this
//    functionReference.call( thisArg , ...params );
//    对于箭头函数来说，可以使用 call 来调用，但不能更改箭头函数内部的 this
// 2、Function.prototype.call( thisArg , ...params ) 可以调用除箭头函数外的其它函数

// MDN:
// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/call

let divide = (a,b) => {
    console.log( this );
    return a /b ;
};

console.log( divide.call( {name:'猪悟能'} , 6 , 2 ) );